/*
 * Copyright (c) 2010 Mathew Hall, University of Sheffield.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or
 * without modification, are permitted provided that the following conditions
 * are met:
 *
 * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following
 * disclaimer in the documentation and/or other materials provided
 * with the distribution.
 *
 * Neither the name of the University of Sheffield nor the names of its
 * contributors may be used to endorse or promote products derived
 * from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
package translator;

import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import primitives.cluster.ClusterHead;
import primitives.cluster.IClusterLevel;
import primitives.graph.Graph;
import primitives.graph.Node;

public class SILWriter implements GraphWriter {

	public static String getSIL(ClusterHead ch) {
		String ret = "";

		for (IClusterLevel l : ch.getChildren()) {
			ret += writeCluster(l);
		}
		return ret;
	}

	public static String writeCluster(IClusterLevel l) {
		return "SS(SS-L0:" + getName(l) + ")=" + join(getNodeNames(l), ",")
				+ "\n";
	}

	public static String getName(IClusterLevel cl) {
		return join(cl.getIDs(), "_");
	}

	private static String join(Collection<? extends Object> c, String d) {
		String ret = "";
		Iterator<? extends Object> iter = c.iterator();
		while (iter.hasNext()) {
			ret += (iter.next()).toString();
			if (iter.hasNext()) {
				ret += d;
			}
		}
		return ret;

	}

	public static Set<String> getNodeNames(IClusterLevel l) {
		HashSet<String> nodes = new HashSet<String>();
		for (Node n : l.getNodes()) {
			nodes.add(n.getLabel());
		}
		return nodes;
	}

	@Override
	public String getRepresentation(ClusterHead ch) {
		return getSIL(ch);
	}

	@Override
	public String getRepresentation(Graph g) {
		// TODO Auto-generated method stub
		return getSIL(new ClusterHead(g));
	}

}
